<template>
	<view>
		<view v-show="isShow" @click="showHandler" class="mask" @touchmove.stop.prevent="()=>{}"></view>
		<view v-show="isShow" class="share-body">
			<scroll-view scroll-x class="share-scroll noScorll">
				<view class="share-item" @click="share(item)"
					v-for="(item, index) in providerList" :key="index"
				>
					
					<image :src="item.icon"></image>
					<view>{{item.name}}</view>
				</view>
			</scroll-view>

			<view class="share-cancel" @click="showHandler">取消</view>
		</view>
	</view>
</template>

<script>
	export default {

		props: {
			shareData: Object 
		},

		watch: {
			// 监听分享数据变化
			shareData(newVal) {
				// 如果有主图则更新图片
				if(newVal.mainImage) this.image = newVal.mainImage
				// 如果有标题则更新标题
				if(newVal.title) this.title = newVal.title
				// 更新分享链接
				this.href = this.$env.HOST_H5 + this.$util.routePath()
			}
		},

		data() {
			return {
				isShow: false, 
				title: '在线教育APP视频教程', 
				shareText: '知行峰-陪你学习，伴你梦想',
				href:  'https://www.mengxuegu.com', 
				image: 'https://gd4.alicdn.com/imgextra/i4/3603079088/O1CN01dczOSM2H0LvTowhkl_!!3603079088.png', 
				shareType: 0, // 分享类型：0 图文，1 文字，2图片
				providerList: [] // 分享提供商列表
			}
		},

		created: function () { // 不能写onload，因为 当前是组件，没有页面钩子
			// 获取可用的分享提供商
			uni.getProvider({
				service: 'share',
				success: (e) => {
					// console.log('success', e);
					let data = [] // 提供商数组
					// 遍历获取到的提供商
					for (let i = 0; i < e.provider.length; i++) {
						// 根据不同提供商添加对应的分享选项
						switch (e.provider[i]) {
							case 'weixin':
								// 微信好友分享
								data.push({
									name: '微信好友',
									id: 'weixin',
									sort:0,
									icon: '/static/share/weixin.png'
								})
								// 微信朋友圈分享
								data.push({
									name: '微信朋友圈',
									id: 'weixin',
									type:'WXSenceTimeline',
									sort:1,
									icon: '/static/share/pengyouquan.png'
								})
								break;
							case 'sinaweibo':
								// 新浪微博分享
								data.push({
									name: '新浪微博',
									id: 'sinaweibo',
									sort:2,
									icon: '/static/share/weibo.png'
								})
								break;
							case 'qq':
								// QQ好友分享
								data.push({
									name: 'QQ好友',
									id: 'qq',
									sort:3,
									icon: '/static/share/qq.png'
								})
								break;
							default:
								break;
						}
					}

					// 添加复制链接选项
					data.push({
						name: '复制链接',
						id: 'copy',
						sort: 4,
						icon: '/static/share/link.png'
					})
					// 按排序字段排序提供商列表
					this.providerList = data.sort((x,y) => {
						return x.sort - y.sort
					});

					// console.log('providerList', this.providerList)
				},
				fail: (e) => {
					// 获取分享通道失败处理
					console.log('获取分享通道失败', e);
					uni.showModal({
						content:'获取分享通道失败',
						showCancel:false
					})
				}
			});
		},

		methods: {
			// 显示隐藏分享组件
			showHandler() {
				this.isShow = !this.isShow
			},

			// 分享方法
			async share(e) {
				console.log('分享通道:'+ e.id +'； 分享类型:' + this.shareType);

				// 复制链接处理
				if(e.id === 'copy') {
					uni.setClipboardData({
					    data: this.href, 
					    success: () => {
							uni.hideToast()
							this.$util.msg('已复制到剪贴板') 
					    }
					});
					this.showHandler() // 隐藏分享组件
					return
				}


				uni.showLoading()

				// 检查分享内容是否为空
				if(!this.shareText && (this.shareType === 1 || this.shareType === 0)){
					uni.showModal({
						content:'分享内容不能为空',
						showCancel:false
					})
					return;
				}

				// 检查分享图片是否为空
				if(!this.image && (this.shareType === 2 || this.shareType === 0)){
					uni.showModal({
						content:'分享图片不能为空',
						showCancel:false
					})
					return;
				}

				// 分享选项配置
				let shareOPtions = {
					provider: e.id, // 分享提供商
					scene: e.type && e.type === 'WXSenceTimeline' ? 'WXSenceTimeline' : 'WXSceneSession', // 分享场景
					type: this.shareType, // 分享类型
					success: (e) => { // 分享成功回调
						console.log('success', e);
						uni.showModal({
							content: '已分享',
							showCancel:false
						})
					},
					fail: (e) => {
						console.log('fail', e)
						uni.showModal({
							content: e.errMsg,
							showCancel:false
						})
					},
					complete:function(){
						console.log('分享操作结束!')
					}
				}

				// 根据分享类型设置不同的分享参数
				switch (this.shareType){
					case 0: // 图文分享
						shareOPtions.summary = this.shareText; // 分享摘要
						shareOPtions.imageUrl = this.image; // 分享图片
						shareOPtions.title = this.title; // 分享标题
						shareOPtions.href = this.href; // 分享链接
						break;
					case 1: // 文字分享
						shareOPtions.summary = this.shareText; // 分享文本
						break;
					case 2: // 图片分享
						shareOPtions.imageUrl = this.image; // 分享图片
						break;
					case 5: // 小程序分享
						shareOPtions.imageUrl = this.image ? this.image : 'https://img-cdn-qiniu.dcloud.net.cn/uniapp/app/share-logo@3.png'
						shareOPtions.title = '欢迎体验uniapp'; // 分享标题
						shareOPtions.miniProgram = { // 小程序配置
							id:'gh_33446d7f7a26',
							path:'/pages/tabBar/component/component',
							webUrl:'https://uniapp.dcloud.io',
							type:0
						};
						break;
					default:
						break;
				}

				// iOS平台图文分享需要压缩图片
				if(shareOPtions.type === 0 && plus.os.name === 'iOS'){
					shareOPtions.imageUrl = await this.compress(); // 压缩图片
				}
				// QQ文字分享需要添加链接和标题
				if(shareOPtions.type === 1 && shareOPtions.provider === 'qq'){
					shareOPtions.href = this.href; // 分享链接
					shareOPtions.title = this.title; // 分享标题
				}

				uni.hideLoading()
				uni.share(shareOPtions);
			},

			compress(){//压缩图片 图文分享要求分享图片大小不能超过20Kb
				console.log('开始压缩');
				let img = this.image;
				return new Promise( async  (res) => {
					// var localPath = plus.io.convertAbsoluteFileSystem(img.replace('file://', ''));
					// console.log('after' + localPath);

					// 如果是网络图片需要先下载
					if(img.startsWith('http')) {
						img = await this.downFile(img)
					}

					// 压缩图片大小
					plus.io.resolveLocalFileSystemURL(img, (entry) => {
					// plus.io.resolveLocalFileSystemURL(localPath, (entry) => {
						entry.file((file) => {// 可通过entry对象操作图片
							console.log('getFile:' + JSON.stringify(file));
							// 如果文件大小超过20Kb则进行压缩
							if(file.size > 20480) {
								plus.zip.compressImage({
									src: img,
									dst: img.replace('.jpg', '2222.jpg').replace('.JPG', '2222.JPG'), 
									width: '10%', 
									height: '10%', 
									quality: 1, // 质量
									overwrite: true // 是否覆盖原文件
								}, (event) => {
									// console.log('success zip****' + event.size);
									let newImg = img.replace('.jpg', '2222.jpg').replace('.JPG', '2222.JPG'); 
									res(newImg); 
								}, function(error) {
									uni.showModal({
										content:'分享图片太大,需要请重新选择图片!',
										showCancel:false
									})
								});
							}
						});
					}, (e) => {
						console.log('Resolve file URL failed: ' + e.message);
						uni.showModal({
							content:'分享图片太大,需要请重新选择图片!',
							showCancel:false
						})
					});
				})
			},

			downFile(url) {
				console.log('url', url)
				return new Promise((resolve) => {
					uni.downloadFile({
						url,
						success: (res) => {
							// console.log('下载完成', res.tempFilePath)
							resolve( res.tempFilePath) 
						},
					})
				})
			}
		}
	}
</script>

<style lang="scss">
	/* 遮罩样式 */
	.mask {
		z-index: 99; // 层级
		position: fixed; // 固定定位
		top: 0; // 顶部距离
		left:0; // 左侧距离
		right: 0; // 右侧距离
		bottom: 0; // 底部距离
		background-color: rgba(0,0,0, 0.6); // 半透明黑色背景
	}

	/* 分享组件主体样式 */
	.share-body {
		z-index: 100; // 层级
		position: fixed; // 固定定位
		left:0; // 左侧距离
		right: 0; // 右侧距离
		bottom: 0; // 底部距离

		/* 分享滚动区域样式 */
		.share-scroll {
			background-color: #f7f7f7; // 背景颜色
			width: 100%; // 宽度
			height: 200rpx; // 高度
			display: flex; // 弹性布局
			white-space: nowrap; // 不换行
			padding-top: 45rpx; // 上内边距

			/* 分享项样式 */
			.share-item {
				display: inline-flex; // 行内弹性布局
				flex-direction: column; // 垂直排列
				justify-content: center; // 水平居中
				align-items: center; // 垂直居中
				width: 25%; // 宽度25%

				/* 分享图标样式 */
				image{
					width: 60rpx; // 宽度
					height: 60rpx; // 高度
				}

				/* 分享文字样式 */
				view {
					color: $mxg-text-color-grey; // 文字颜色
					font-size: 25rpx; // 字体大小
					padding-top: 10rpx; // 上内边距
				}
			}
		}

		/* 取消按钮样式 */
		.share-cancel {
			background-color: #fff; // 背景颜色
			text-align: center; // 文本居中
			width: 100%; // 宽度
			padding: 25rpx 0; // 垂直内边距
		}
	}
</style>
